JVM五 日志分析
类型概述
- [DefNew 表示用的Serial 年轻代回收器
- [ParNew 表示年轻代用的 Parnew
- [PSYoungGen: 表示年轻代用的是 Parallel Scanvenge
[Times: user=0.06 sys=0.01, real=0.04 secs]
第一个是用户态消耗的CPU时间,第二个是内核消耗的CPU时间,第三个是用户实际消耗的时间
因为可能是多CPU协同完成的,所以real时间虽然加上了IO阻塞和线程等待,但是总时间还是小于user时间
其实只要看 第一个时间 0.0451720 这个时间即可
GC日志计算规则
- 回收器类型 JDK 1.7 默认是 Mark Sweep Compact
- 最大堆区:设置的1500M
- 最小500M, 而默认的新生代 和老年代的比例是2,所以 新生代的大小是500/3=166M
- Eden:S=4,所以S0=166/6=27.75, Eden: 27.75*4=111M, 111 +27.75 +27.75=16
- 都是不含S0区的大小
- GC实际耗时 参考的是一个时间0.0314790秒 解决 real=0.04
- FULL GC会触发 Minor GC OldGC PermGC
虚拟机环境
所以第一行: 113792 –> 13544K (142208)
年轻代GC前大小 –> 年轻代GC后大小 (年轻代容量 不含S0)
(500M/3)1024K=170666K (新生代总大小)
170666/6=28444K(S0区大小)
(170666/6)5=142221( S0+Eden区的大小 也就是显示的 142208K)
113792 –>13544K(483585K) 堆内存GC前实际大小 –> GC后堆内存大小 (堆实际大小 不含S0区)
483585K+28444=512029K /1024=500M
测试环境含FULL GC
因为测试环境用的是 Parallel GC回收器,系统会根据算法分配内存空间,从而获取最大的吞吐量(减少GC时间占用总时间的比率)
GC日志参数设置
可以参照这个设置在 catelina.sh中配置
JAVA_OPTS=”-server -Xms500m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:SurvivorRatio=4
-verbose:gc -Xloggc:/usr/local/jvmlog/gc.log
-Djava.awt.headless=true
-XX:+PrintGCDateStamps -XX:+PrintGCDetails
-Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000 -XX:MaxTenuringThreshold=15”
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式 基准时间是tomcat的启动时间)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
触发FULL GC的情况
full gc是对新生代,旧生代,以及持久代的统一回收,由于是对整个空间的回收,因此比较慢,系统中应当尽量减少full gc的次数。
- 旧生代空间不足
- 持久代空间不足
- CMS GC时出现了promotion failed和concurrent mode failure
- 统计得到新生代minor gc时晋升到旧生代的平均大小小于旧生代剩余空间
- 直接调用System.gc,可以DisableExplicitGC来禁止